#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#define fast ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define ll long long
#define ld long double
#define el "\n"
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
#define ordered_multiset tree<ll, null_type,less_equal<ll>, rb_tree_tag, tree_order_statistics_node_update>
using namespace __gnu_pbds;
using namespace std;
const ll N = 1e5 + 5, INF = 1e18;
const ld pi = acos(-1);
const int mod = 1e9 + 7, LOG = 20;
const ld eps = 1e-4;
int dx[] = {0, -1, 0, 1, -1, 1, -1, 1};
int dy[] = { -1, 0, 1, 0, 1, -1, -1, 1};
ll n, m, k, x, y;
ll a[N], b[N];
struct Line {
ll m, b;
mutable function<const Line *()> succ;
bool operator<(const Line &other) const {
return m < other.m;
}
bool operator<(const ll &x) const {
const Line *s = succ();
if (!s) {
return 0;
}
return b - s->b < (s->m - m) * x;
}
};
// will maintain upper hull for maximum
struct DynamicHull : public multiset<Line, less<>> {
bool bad(iterator y) {
auto z = next(y);
if (y == begin()) {
if (z == end()) {
return 0;
}
return y->m == z->m && y->b <= z->b;
}
auto x = prev(y);
if (z == end()) {
return y->m == x->m && y->b <= x->b;
}
return (ld) (x->b - y->b) * (z->m - y->m) >= (ld) (y->b - z->b) * (y->m - x->m);
}
void add(ll m, ll b) {
auto y = insert({m, b});
y->succ = [ = ] { return next(y) == end() ? 0 : &*next(y); };
if (bad(y)) {
erase(y);
return;
}
while (next(y) != end() && bad(next(y))) {
erase(next(y));
}
while (y != begin() && bad(prev(y))) {
erase(prev(y));
}
}
ll query(ll x) {
auto l = *lower_bound(x);
return l.m * x + l.b;
}
};
void dowork() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= n; i++) {
cin >> b[i];
}
DynamicHull cht;
cht.add(-b[1], 0);
ll ans;
for (int i = 2; i <= n; i++) {
ans = cht.query(a[i]);
cht.add(-b[i], ans);
}
cout << abs(ans) << el;
}
signed main() {
fast
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
int t = 1;
//cin >> t;
for (int i = 1; i <= t; i++) {
dowork();
}
return 0;
}
991B - Getting an A | 246A - Buggy Sorting |
884A - Book Reading | 1180A - Alex and a Rhombus |
445A - DZY Loves Chessboard | 1372A - Omkar and Completion |
159D - Palindrome pairs | 981B - Businessmen Problems |
1668A - Direction Change | 1667B - Optimal Partition |
1668B - Social Distance | 88B - Keyboard |
580B - Kefa and Company | 960A - Check the string |
1220A - Cards | 897A - Scarborough Fair |
1433B - Yet Another Bookshelf | 1283B - Candies Division |
1451B - Non-Substring Subsequence | 1408B - Arrays Sum |
1430A - Number of Apartments | 1475A - Odd Divisor |
1454B - Unique Bid Auction | 978C - Letters |
501B - Misha and Changing Handles | 1496A - Split it |
1666L - Labyrinth | 1294B - Collecting Packages |
1642B - Power Walking | 1424M - Ancient Language |